from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from django.conf import settings



class FastDFSStorage(Storage):
    """自定义文件存储系统类"""

    def __init__(self,base_url =None,client_conf =None):
        """自定义初始化方法"""
        self.base_url = base_url or settings.FDFS_BASE_URL
        self.client_conf = client_conf or settings.FDFS_CLIENT_CONF
    def _open(self, name, mode='rb'):
        """
        存储系统打文件存储的文件时调用此方法,因为我们自定义文件存储系统类,只是为了修改上传的目的,不需要打开,所以重写此方法什么也不做pass
        """
        pass
    def _save(self,name,content):
# 创建fastDFS客户端对象 指定客户端配置文件
        client =Fdfs_client(self.client_conf)
# 上传文件
        ret =client.upload_by_buffer(content.read())
# 判断文件是否上传成功
        if ret.get('Status') !='Upload successed.':
            raise Exception('Upload file failed')
        file_id =ret.get('Remote file_id')  # 获取字典中的file_id
        return file_id

    def url(self,name):
        """
        当需要下载Storage服务器中的图片时,就会调用此方法拼接出图片完整的下载路径

        """
        return self.base_url + name

    def exists(self, name):
        """
               每次进行上传文件之前就会先调用此方法进行判断,当前要上传的文件是否已经在stroage服务器,如果在就不要上传了
               """
        return False
